package com.sacodemel.financeiro.mb;

import com.sacodemel.financeiro.servico.ISegurancaService;
import com.sacodemel.financeiro.servico.impl.SegurancaService;
import com.sacodemel.financeiro.util.JSFUtil;
import com.sacodemel.financeiro.util.ResourceService;
import java.io.IOException;
import java.util.Date;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author X4Q1
 */
@ManagedBean
@RequestScoped
public class SegurancaMB {

    private String perfil;
    private String chave;
    private String mensagem;
    public static final String CONSULTANTE = "CONSULTANTE";
    public static final String ADM = "ADM";
    public static final String ROOT = "ROOT";
    ISegurancaService segurancaService;

    public String entrar() throws IOException {

        segurancaService = new SegurancaService();

        String perfilAutenticado = null;

        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

        perfilAutenticado = retornaPerfil(this.perfil, this.chave);

        if (!segurancaService.isConexaoOk()) {
            JSFUtil.adicionaMensagem("Falha na Conexao com o banco");
            return null;
        }

        if (perfilAutenticado != null) {
            session.setAttribute("perfil", perfilAutenticado);
            rp.sendRedirect(rq.getContextPath() + "/paginas/principal.xhtml");
            return "index";

        } else {
            session.setAttribute("perfil", null);
            session.removeAttribute("perfil");

            this.geraMensagemAviso(this.perfil);

            return null;
        }


    }

    public String sair() {
        HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
        session.invalidate();
        try {
            rp.sendRedirect(rq.getContextPath() + "/paginas/login.xhtml");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "login";
    }

    public String gerarBackup() throws IOException {

        this.gerarArquivo();

        FacesContext.getCurrentInstance().responseComplete();

        return null;
    }

    public boolean isPerfilConsultante() {
        return SegurancaMB.CONSULTANTE.equals(getPerfilLogado());
    }

    public boolean isPerfilADM() {
        return SegurancaMB.ADM.equals(getPerfilLogado()) ||  isPerfilRoot();
    }
    
    public boolean isPerfilRoot() {
        return SegurancaMB.ROOT.equals(getPerfilLogado());
    }

    public String getPerfilLogado() {
        HttpServletRequest rq = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        return (String) rq.getSession().getAttribute("perfil");
    }

    /**
     * @return the perfil
     */
    public String getPerfil() {
        return perfil;
    }

    /**
     * @param perfil the perfil to set
     */
    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

    /**
     * @return the chave
     */
    public String getChave() {
        return chave;
    }

    /**
     * @param chave the chave to set
     */
    public void setChave(String chave) {
        this.chave = chave;
    }

    private String retornaPerfil(String perfil, String chave) throws IOException {

        if (perfil != null && chave != null) {

            ResourceService res = ResourceService.getInstance("chave");

            if (perfil.toUpperCase().equals(SegurancaMB.CONSULTANTE) && res.getProperty("chave_consultante").equals(chave.toUpperCase())) {
                return SegurancaMB.CONSULTANTE;
            } else if (perfil.toUpperCase().equals(SegurancaMB.ADM) && res.getProperty("chave_adm").equals(chave.toUpperCase())) {
                return SegurancaMB.ADM;
            } else if (perfil.toUpperCase().equals(SegurancaMB.ROOT) && res.getProperty("chave_root").equals(chave.toUpperCase())) {
                return SegurancaMB.ROOT;
            }
        }

        return null;
    }

    private void geraMensagemAviso(String perfil) {


        if (perfil.toUpperCase().equals(SegurancaMB.CONSULTANTE) || perfil.toUpperCase().equals(SegurancaMB.ADM)
                 || perfil.toUpperCase().equals(SegurancaMB.ROOT)) {
            JSFUtil.adicionaMensagem("Chave Inválida");
        } else {
            JSFUtil.adicionaMensagem("Perfil e Chave Inválidos");
        }



    }

    /**
     * @return the mensagem
     */
    public String getMensagem() {
        return mensagem;
    }

    /**
     * @param mensagem the mensagem to set
     */
    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

//    protected void gerarArquivo() {
//
//        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
//
//        segurancaService = new SegurancaService();
//        
//        File file = segurancaService.gerarBackup();
//
//        response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
//        response.setContentLength((int) file.length());
//        response.setContentType(file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length()));
//
//        try {
//            ServletOutputStream arquivo = response.getOutputStream();
//
//            FileInputStream in = new FileInputStream(file);
//
//            byte[] buf = new byte[(int) file.length()];
//            int count;
//            while ((count = in.read(buf)) >= 0) {
//                arquivo.write(buf, 0, count);
//            }
//
//            in.close();
//            arquivo.flush();
//            arquivo.close();
//
//        } catch (IOException e) {
//            JSFUtil.adicionaMensagem(e.getMessage());
//        }
//
//    }

    
     protected void gerarArquivo() {

        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        response.setHeader("Content-Disposition", "attachment;filename=\"backup_"+JSFUtil.formataData(new Date())+".zip\"");
        response.setContentType("zip");

        try {
             segurancaService = new SegurancaService();
             segurancaService.gerarArquivosBackup(response.getOutputStream());
            
        } catch (IOException e) {
            JSFUtil.adicionaMensagem(e.getMessage());
        }

    }

}
